package com.glink.manage.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.glink.common.exception.GeneralSimpleException;
import com.glink.manage.domain.VehicleInfoBean;
import com.glink.manage.dto.vehicle.*;
import com.glink.manage.vo.vehicle.VehicleLicensePlateVO;
import com.glink.manage.vo.vehicle.VehiclePageVO;

import java.util.Date;
import java.util.List;
import java.util.Set;

public interface VehicleService extends IService<VehicleInfoBean> {

    /**
     * 新增车辆/特种设备信息
     * @param vehicleAddDTO 车辆/特征设备信息
     * @return 车辆/特征设备信息状态
     */
    String addVehicle(VehicleAddDTO vehicleAddDTO) throws GeneralSimpleException; //新增

    /**
     * 删除车辆/特种设备信息
     * @param vehicleDelDTO 车辆/特种设备主键ID
     * @return 删除车辆/特种设备信息状态
     */
    boolean delVehicle(VehicleDelDTO vehicleDelDTO) throws GeneralSimpleException; //删除

    /**
     * 加入或取消黑名单
     * @param vehicleBlackListDTO 黑名单信息
     * @return 状态
     */
    boolean addBlacklistVehicle(VehicleBlackListDTO vehicleBlackListDTO) throws GeneralSimpleException; // 加入/移除黑名单

    /**
     * 解除黑名单
     * @param vehicleIdDTO ID
     * @return 状态
     */
    boolean liftBlacklistVehicle(VehicleIdDTO vehicleIdDTO) throws GeneralSimpleException; // 解除黑名单

    /**
     * 分页查询-车辆和特种设备页面
     * @param vehicleFindDTO 查询条件
     * @return 页面信息
     */
    IPage<VehiclePageVO> findVehicle(VehicleFindDTO vehicleFindDTO) throws GeneralSimpleException; // 分页查询-车辆和特种设备页面

    /**
     * 分页查询-黑名单
     * @param vehicleFindDTO 查询条件
     * @return 页面信息
     */
    IPage<VehiclePageVO> findVehicleBlackList(VehicleFindDTO vehicleFindDTO) throws GeneralSimpleException;

    /**
     * 通过车牌照查询信息
     * @param vehicleLicensePlateDTO 车牌号
     * @return 车辆/特种设备信息
     */
    VehicleLicensePlateVO findByCar(VehicleLicensePlateDTO vehicleLicensePlateDTO) throws GeneralSimpleException;

    /**
     * 通过车牌主键ID查询信息
     * @param vehicleIdDTO 主键id
     * @return 车辆/特征设备信息
     */
    VehicleLicensePlateVO findById(VehicleDelDTO vehicleIdDTO) throws GeneralSimpleException;

    /**
     * 保存准入工程
     * @param vehicleId 车辆/特种设备ID
     * @param constructionWorkObjId 工程ID
     * @param cycleStart 准入周期开始
     * @param cycleEnd 准入周期结束
     */
    void saveAccessWork(String vehicleId, String constructionWorkObjId, Date cycleStart, Date cycleEnd, String accessMonadObjId); // 保存准入

    /**
     * 检查黑名单
     * @param associationObjId 用户ID
     * @return 状态
     */
    boolean checkBlackList(String associationObjId) throws GeneralSimpleException; // 检查

    /**
     * 更新车辆/特种设备
     * @param vehicleUpdateDTO 更新信息
     * @return 更新信息状态
     */
    boolean updateVehicle(VehicleUpdateDTO vehicleUpdateDTO) throws GeneralSimpleException;

    /**
     * 根据车牌查询车辆信息
     * @param plateNum 车牌
     * @return 车辆信息
     */
    VehicleInfoBean findByLicensePlate(String plateNum);

    /**
     * 根据参建单位和工程查询准入的车辆
     *
     * @param constructionWorkObjId  工程ID
     * @param participatingUnitObjId 参建单位ID
     * @return 准入人员名称
     */
    List<String> findAccessLicensePlateByWorkObjIdAndUnitObjId(String constructionWorkObjId, String participatingUnitObjId);

    /**
     * 更新用户准入周期
     * @param constructionWorkObjId 工程ID
     * @param participatingUnitObjId 参建单位ID
     * @return 更新状态
     */
    boolean updateAccessCycleByWorkObjIdAndUnitObjId(String constructionWorkObjId, String participatingUnitObjId);

    /**
     * 根据车辆类型统计车辆数
     * @param carType 车辆类型
     * @param vehicleIdList 车辆ID
     * @return 车辆类型
     */
    Integer countByTypeAndObjIdInAndLicensePlateIn(String carType, List<String> vehicleIdList, Set<String> licensePlateList);
    Integer countByTypeAndLicensePlateIn(String carType, Set<String> licensePlateList);

    /**
     * 根据工程ID查询未同步的车牌号
     *
     * @param devSno 设备序号
     * @param workObjId 工程ID
     * @return 车牌准入信息
     */
    List<VehicleSyncDTO> findLicensePlateByWorkIdAndNotSync(String devSno, String workObjId, Date date);

    /**
     * 根据工程ID查询未同步的车牌号
     *
     * @param devSno 设备号
     * @param workObjId 工程ID
     * @return 车牌准入信息
     */
    List<VehicleSyncDTO> findLicensePlateByWorkId(String devSno, String workObjId, List<String> orgIdList, Date date, boolean sync);
}
